Data Tidying
Humboldt-Universität zu Berlin
2023-12-13
Heute werden wir lernen…
Die vorgeschlagenen Ressourcen für dieses Thema sind
languageR_english.csv (im Ordner daten)df_eng <- read_csv(here("daten", "languageR_english.csv")) |>
1 clean_names() |>
2 arrange(word) |>
3 rename(
4 rt_lexdec = r_tlexdec,
5 rt_naming = r_tnaming
) |>
6 select(age_subject, word, word_category, rt_lexdec, rt_naming)janitor)
wort in ansteigender Reihenfolge anordnen (A-Z)
r_tlexdec in rt_lexdec umbenennen
r_tlexdec in rt_lexdec umbenennen
Abbildung 1: A model of the data science process from Wickham et al. (2023) (all rights reserved)
readr::read_csv)dplyr)ggplot)tidyr) noch nicht durchführencountry)year)population)cases)| country | year | cases | population |
|---|---|---|---|
| Afghanistan | 1999 | 745 | 19987071 |
| Afghanistan | 2000 | 2666 | 20595360 |
| Brazil | 1999 | 37737 | 172006362 |
| Brazil | 2000 | 80488 | 174504898 |
| China | 1999 | 212258 | 1272915272 |
| China | 2000 | 213766 | 1280428583 |
| country | year | type | count |
|---|---|---|---|
| Afghanistan | 1999 | cases | 745 |
| Afghanistan | 1999 | population | 19987071 |
| Afghanistan | 2000 | cases | 2666 |
| Afghanistan | 2000 | population | 20595360 |
| Brazil | 1999 | cases | 37737 |
| Brazil | 1999 | population | 172006362 |
| Brazil | 2000 | cases | 80488 |
| Brazil | 2000 | population | 174504898 |
| China | 1999 | cases | 212258 |
| China | 1999 | population | 1272915272 |
| China | 2000 | cases | 213766 |
| China | 2000 | population | 1280428583 |
| country | year | rate |
|---|---|---|
| Afghanistan | 1999 | 745/19987071 |
| Afghanistan | 2000 | 2666/20595360 |
| Brazil | 1999 | 37737/172006362 |
| Brazil | 2000 | 80488/174504898 |
| China | 1999 | 212258/1272915272 |
| China | 2000 | 213766/1280428583 |
Abbildung 2: Image source: Wickham et al. (2023) (all rights reserved)
“Glückliche Familien sind alle gleich; jede unglückliche Familie ist auf ihre eigene Art unglücklich.”
— Leo Tolstoy
“‘Tidy’ Datensätze sind alle gleich, aber jeder ‘untidy’ Datensatz ist auf seine eigene Weise unordentlich.”
— Hadley Wickham
Die Arbeit mit aufgeräumten Daten hat zwei wesentliche Vorteile:
tidyverse sind darauf ausgelegt, mit aufgeräumten Daten zu arbeiten (z.B. ggplot2 und dplyr)tidyverseDas Paket tidyr (aus tidyverse) hat zwei nützliche Funktionen zum Transponieren unserer Daten:
pivot_longer(): macht breite Daten längerpivot_wider(): lange Daten breiter machenAbbildung 3: die berühmteste Verwendung des Wortes Pivot (zumindest für Millenials) (Friends)
Wir müssen oft zwischen breiten und langen Datenformaten konvertieren, um verschiedene Arten von Zusammenfassungen oder Visualisierungen zu erstellen
breite Daten: alle Beobachtungen zu einer Sache befinden sich in einer einzigen Zeile
lange Daten: jede Beobachtung befindet sich in einer separaten Zeile
Beginnen wir mit dem typischsten Fall: Umwandlung breiter Daten in lange Daten
pivot_longer()languageR_english.csv (df_eng)
age_subject gibt an, ob eine Beobachtung von einem Teilnehmer der Altersgruppe old oder young stammtword und word_category beschreiben Eigenschaften des Stimulus für eine bestimmte Beobachtung (d. h. das Wort)rt_lexdec enthält die Reaktionszeit für eine lexikalische Entscheidungsaufgabert_naming enthält die Antwortzeit für eine Wortbenennungsaufgabehead(df_eng)| age_subject | word | word_category | rt_lexdec | rt_naming |
|---|---|---|---|---|
| young | ace | N | 623.61 | 456.3 |
| old | ace | N | 775.67 | 607.8 |
| young | act | V | 617.10 | 445.8 |
| old | act | V | 715.52 | 639.7 |
| young | add | V | 575.70 | 467.8 |
| old | add | V | 742.19 | 605.4 |
Abbildung 4: Our plot to be reproduced
rt_lexdec und rt_naming erscheinen in Facetten
facet_wrap() nimmt eine kategorische Variable als Argument und erzeugt eine Facette für jede Kategorielexdec und naming enthält
pivot_longer()pivot_longer() (von tidyr) konvertiert eine breite Datentabelle in ein längeres Format
1df_eng_long <-
2 df_eng %>%
3 pivot_longer(
4 cols = starts_with("rt_"),
5 names_to = "response",
6 values_to = "time"
)df_eng_long, das…
df_eng, und dann
col =) nimmst, die mit rt_ beginnen
response erstellen, die die Namen aus cols enthält (names_to =)
time erstellen, die die Werte aus cols enthält (values_to =)
ace und act in
| age_subject | word | rt_lexdec | rt_naming |
|---|---|---|---|
| young | ace | 623.61 | 456.3 |
| old | ace | 775.67 | 607.8 |
| young | act | 617.10 | 445.8 |
| old | act | 715.52 | 639.7 |
| age_subject | word | response | time |
|---|---|---|---|
| young | ace | rt_lexdec | 623.61 |
| young | ace | rt_naming | 456.30 |
| old | ace | rt_lexdec | 775.67 |
| old | ace | rt_naming | 607.80 |
| young | act | rt_lexdec | 617.10 |
| young | act | rt_naming | 445.80 |
| old | act | rt_lexdec | 715.52 |
| old | act | rt_naming | 639.70 |
rt_lexdecrt_namingage_subject auf der x-Achsetime auf der y-Achseresponse in FacettenAbbildung 5: Response times per age group for the lexical decision task vs. naming task
Aufgabe 1: Tidy data
Beispiel 1
Abbildung 5 neu erstellen.
pivot_wider()tidyr-Funktion pivot_wider() macht Datensätze breiter, indem sie Spalten vergrößert und Zeilen reduziert.
df_eng breiter zu machen
young Probanden und die Antwort des old Probandenpivot_wider()pivot wider nimmt ähnliche Argumente wie pivot_longer(), mit einigen leichten Unterschieden:
id_cols (optional): identifizierende Spalten (welche Spalten identifizieren jede Beobachtung eindeutig?)names_from: wie soll die neue Spalte heißen, die die vorherigen Spaltennamen enthält (muss eine kategorische Variable sein)?names_prefix (optional): Präfix für die neuen Spaltennamen (optional)values_von: neue Spaltenwerteage_subject und ihre Werte von rt_lexdec übernehmendf_eng_wide <-
df_eng %>%
select(-rt_naming) |>
pivot_wider(
1 names_from = age_subject,
2 values_from = rt_lexdec,
3 names_prefix = "lexdec_"
)age_subject erstellen
rt_lexdec
lexdec_ am Anfang der neuen Spaltennamen
ace und act in
| age_subject | word | word_category | rt_lexdec |
|---|---|---|---|
| young | ace | N | 623.61 |
| old | ace | N | 775.67 |
| young | act | V | 617.10 |
| old | act | V | 715.52 |
| word | word_category | lexdec_young | lexdec_old |
|---|---|---|---|
| ace | N | 623.61 | 775.67 |
| act | V | 617.10 | 715.52 |
rt_naming entfernt, weil es auch einen eindeutigen Wert pro Wort pro Altersgruppe hatNA-Werte für lexdec_young für alte Themen und NA-Werte für lexdec_old für junge Themen ein| word | word_category | rt_naming | lexdec_young | lexdec_old |
|---|---|---|---|---|
| ace | N | 456.3 | 623.61 | NA |
| ace | N | 607.8 | NA | 775.67 |
| act | V | 445.8 | 617.10 | NA |
| act | V | 639.7 | NA | 715.52 |
Heute haben wir gelernt…
Für diese Aufgaben werden wir mit dem Datensatz df_eng arbeiten.
pivot_wider, um mit rt_naming neue Variablen zu erstellen: naming_old und naming_young, die die Reaktionszeiten beim Benennen für alte bzw. junge Teilnehmer enthalten. Hinweis: Sie müssen rt_lexdec entfernen. Der resultierende Datenrahmen sollte 2284 Beobachtungen und 4 Variablen enthalten.pivot_wider().Abbildung 6: Scatterplot of lexical decision task response times per word for old versus young participants
df_eng_wide, um Abbildung 6 zu erstellen? Mit anderen Worten, warum ist df_eng_wide die geeignete Struktur für ein solches Streudiagramm, aber nicht df_eng_long?df_eng_long und die Funktion summarise(), die wir im letzten Abschnitt gesehen haben, um die folgende Zusammenfassung zu reproduzieren:# A tibble: 2 × 3
response mean sd
<chr> <dbl> <dbl>
1 rt_lexdec 708. 115.
2 rt_naming 566. 101.
Hinweis: Müssen Sie NA entfernen (wir haben letzen Woche gesehen, wie man das macht)?
Hergestellt mit R version 4.3.0 (2023-04-21) (Already Tomorrow) und RStudioversion 2023.9.0.463 (Desert Sunflower).
R version 4.3.0 (2023-04-21)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS Ventura 13.2.1
Matrix products: default
BLAS: /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRlapack.dylib; LAPACK version 3.11.0
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
time zone: Europe/Berlin
tzcode source: internal
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] janitor_2.2.0 here_1.0.1 lubridate_1.9.2 forcats_1.0.0
[5] stringr_1.5.0 dplyr_1.1.3 purrr_1.0.2 readr_2.1.4
[9] tidyr_1.3.0 tibble_3.2.1 ggplot2_3.4.3 tidyverse_2.0.0
loaded via a namespace (and not attached):
[1] utf8_1.2.3 generics_0.1.3 xml2_1.3.4 stringi_1.7.12
[5] hms_1.1.3 digest_0.6.33 magrittr_2.0.3 evaluate_0.21
[9] grid_4.3.0 timechange_0.2.0 fastmap_1.1.1 rprojroot_2.0.3
[13] jsonlite_1.8.7 httr_1.4.6 rvest_1.0.3 fansi_1.0.4
[17] viridisLite_0.4.2 scales_1.2.1 cli_3.6.1 rlang_1.1.1
[21] crayon_1.5.2 bit64_4.0.5 munsell_0.5.0 withr_2.5.0
[25] yaml_2.3.7 tools_4.3.0 parallel_4.3.0 tzdb_0.4.0
[29] colorspace_2.1-0 webshot_0.5.4 pacman_0.5.1 kableExtra_1.3.4
[33] png_0.1-8 vctrs_0.6.3 R6_2.5.1 magick_2.7.4
[37] lifecycle_1.0.3 snakecase_0.11.0 bit_4.0.5 vroom_1.6.3
[41] pkgconfig_2.0.3 pillar_1.9.0 gtable_0.3.4 Rcpp_1.0.11
[45] glue_1.6.2 systemfonts_1.0.4 highr_0.10 xfun_0.39
[49] tidyselect_1.2.0 rstudioapi_0.14 knitr_1.44 farver_2.1.1
[53] htmltools_0.5.5 labeling_0.4.3 svglite_2.1.1 rmarkdown_2.22
[57] compiler_4.3.0
Woche 9 - Data Tidying